package com.example.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.nio.file.Files;
/*
 *  @author 雨安
 *  类名： HelloController
 *  创建时间：2024/3/18
 */
@RestController
@RequestMapping("/com/yuan")
public class HelloController {
    /**
     * 权限配置的一些注解
     * 一、@PreAuthorize("hasAuthority('system:admin:list')") 此注解为从数据库查询出来的权限字符串集合中拥有这个字符串则权限通过，此处会将list封装成set集
     * 所有方法都是返回true才可以进行访问
     */
    @GetMapping("/hello")
    @PreAuthorize("hasAuthority('system:admin:list')") //需要在登录UserDetilsService中有这个权限才可以进行访问
    String hello(){
        //返回结果字符串
        return "Hello Security";
    }

    @GetMapping("/image")
    public ResponseEntity<byte[]> getImage() throws IOException {
        // 从类路径下加载图像文件
        Resource resource = new ClassPathResource("static\\QQ1111.png");
        // 读取图像文件的字节数组
        byte[] imageBytes = Files.readAllBytes(resource.getFile().toPath());
        // 返回图像字节数组并设置响应类型为图片类型
        return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(imageBytes);
    }


    /**
     *  权限配置的一些注解
     *  二、@PreAuthorize("hasAnyAuthority('admin','test','system:admin:list')") 此注解为配置的权限中有其中任意一个都可以进行此方法的访问
     */
    @GetMapping("/hehe")
    @PreAuthorize("hasAnyAuthority('admin','test','system:admin:list')")
    String hehe(){
        return "hehe";
    }

    /**
     * 权限配置的一些注解
     * 三、@PreAuthorize("hasRole('system:admin:list')") 此处会对你的权限进行一个权限字符串 + 你的role权限进行一个拼接然后必须拼接一样才可以通过权限
     * 此方法对权限关键字要求较高  此处为配置对应权限是无法访问的
     */
    @GetMapping("xixi")
    @PreAuthorize("hasRole('system:admin:list')")
    String xixi(){
        return "xixi";
    }

    /**
     * 权限配置的一些注解
     * 四、@PreAuthorize("hasAnyRole('admin','system:admin:list')")此处会对你的权限进行一个权限字符串 + 你的role权限进行一个拼接然后必须拼接一样才可以通过权限
     * 此方法对权限关键字要求较高，他也需要拼接后判断      权限配置的时候，可以用*来代表权限的通配符  此处为配置对应权限是无法访问的
     */
    @GetMapping("enen")
    @PreAuthorize("hasAnyRole('admin','system:admin:list')")
    String enen(){
        return "enen";
    }


}
